BigQuery パーティショニング
パーティションは大きく2種類 + シャーディング含めると +1
カラムパーティション > 取り込み時間別 >>> シャーディング
取り込み時間別パーティション
ingestion-time partitioned tables
_PARTITIONTIME でパーティショニングされているもの
事前に取り込み時間別テーブルを作り、BigQuery に書き込むとその時刻が入る
そのため実際のデータのタイムスタンプと BigQuery に書いた時間の差が生まれる場合がある
特定の1日を集計したいなら、クエリする際に前後の日も _PARTITIONTIME 条件に入れたほうが正確
Cloud Logging から sink した場合、ログの timestamp フィールドが _PARTITIONTIME になるので、厳密に時刻と一致する クエリに WHERE _PARTITIONTIME = "..." を含めてスキャン範囲を絞れる
TODO 文字列型? DATE_SUB とかの返り値と比較するとエラーになる
https://gyazo.com/a240654ee5e998d023a0cfa07c35adda
カラムパーティション
date/timestamp partitioned tables
独自の用語、ドキュメントでは以下の2種類
日付 / タイムスタンプ パーティション分割テーブル
整数範囲パーティション分割テーブル
特殊なフィールドではなく、カラムの値でパーティショニングされている
指定できるカラムの型が DATE, TIMESTAMP, INTEGER に限られている
普通にそのカラムをクエリに含めるとスキャン範囲を狭められる
jst_date カラムにパーティションを貼っている例
このテーブルはクエリに WHERE jst_date = "..." を含めることでスキャン範囲を絞れる
https://gyazo.com/eb361c1677187db306d825b9a01d1594
日付シャーディング
date-sharded tables
複数のテーブルを テーブル_YYYYMMDD のように日付で命名したもの
クエリも複雑になるし、制限値 も低いのでパーティショニングできるならそのほうが良い クエリあたりで参照できるテーブルの最大数 - 1,000
こういうクエリでスキャン範囲を狭められる pokutuna.icon これ嫌い!!
FROM dataset.table_*` のようなワイルドカード
FROM dataset.table_201912*` のように月まで絞ったり
WHERE _TABLE_SUFFIX = FORMAT_DATE("%Y%m%d", ...)
ワイルドカードと組み合わせて使う
https://gyazo.com/93a686f69bce7fd750dff9b049702581
https://gyazo.com/50f2218e6ff9a3195ad7b831e1bcab9a
アイコン
https://gyazo.com/0919c99e1e7de88ed8927b56b272f9d1 パーティショニングされているテーブル(カラム & _PARTITIONTIME)
https://gyazo.com/7ed169d6598c088ed48d283561886eef シャード化されたテーブル
https://gyazo.com/8c4e758e437f00843ddb1f78ea268c86 単一のテーブル
https://gyazo.com/c5965cbc343d12280616a97c5fcb827b ビュー